home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / utility / 329 / x6502.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-18  |  48.7 KB  |  2,581 lines

  1.  
  2. /****************************************************************************
  3.  
  4.     X6502.C  
  5.  
  6.     - heap initializer, opcode routines, entry and exit routines
  7.  
  8.     01/23/88 created
  9.     03/03/88 Laser C
  10.  
  11.     07/08/88 21:00
  12.  
  13. ****************************************************************************/
  14.  
  15. #include <stdio.h>
  16. #include <osbind.h>
  17. #include "xglobal.h"
  18. #include "x6502.h"
  19.  
  20. /* format of mnemonics: 3 ascii codes of the opcode and the addressing mode:
  21.    00 - implied     01 - immediate     02 - zero page         03 - zero page,x
  22.    04 - zero page,y 05 - (zero page,x) 06 - (zero page),y
  23.    07 - absolute    08 - absolute,x    09 - absolute,y        0A - accumulator
  24.    0B - relative    0C - indirect      0D - absolute indirect
  25.  
  26.    used by the 6502 monitor for disassembling code
  27. */
  28.  
  29. long rglMnemonics[256] =
  30.  {
  31.  0x42524B00L, 0x4F524105L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524102L,
  32.  0x41534C02L, 0x3F3F3F00L, 0x50485000L, 0x4F524101L, 0x41534C0AL, 0x3F3F3F00L,
  33.  0x3F3F3F00L, 0x4F524107L, 0x41534C07L, 0x3F3F3F00L, 0x42504C0BL, 0x4F524106L,
  34.  0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524103L, 0x41534C03L, 0x3F3F3F00L,
  35.  0x434C4300L, 0x4F524109L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x4F524108L,
  36.  0x41534C08L, 0x3F3F3F00L, 0x4A535207L, 0x414E4405L, 0x3F3F3F00L, 0x3F3F3F00L,
  37.  0x42495402L, 0x414E4402L, 0x524F4C02L, 0x3F3F3F00L, 0x504C5000L, 0x414E4401L,
  38.  0x524F4C0AL, 0x3F3F3F00L, 0x42495407L, 0x414E4407L, 0x524F4C07L, 0x3F3F3F00L,
  39.  0x424D490BL, 0x414E4406L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x414E4403L,
  40.  0x524F4C03L, 0x3F3F3F00L, 0x53454300L, 0x414E4409L, 0x3F3F3F00L, 0x3F3F3F00L,
  41.  0x3F3F3F00L, 0x414E4408L, 0x524F4C08L, 0x3F3F3F00L, 0x52544900L, 0x454F5205L,
  42.  0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5202L, 0x4C535202L, 0x3F3F3F00L,
  43.  0x50484100L, 0x454F5201L, 0x4C53520AL, 0x3F3F3F00L, 0x4A4D5007L, 0x454F5207L,
  44.  0x4C535207L, 0x3F3F3F00L, 0x4256430BL, 0x454F5206L, 0x3F3F3F00L, 0x3F3F3F00L,
  45.  0x3F3F3F00L, 0x454F5203L, 0x4C535203L, 0x3F3F3F00L, 0x434C4900L, 0x454F5209L,
  46.  0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x454F5208L, 0x4C535208L, 0x3F3F3F00L,
  47.  0x52545300L, 0x41444305L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444302L,
  48.  0x524F5202L, 0x3F3F3F00L, 0x504C4100L, 0x41444301L, 0x524F520AL, 0x3F3F3F00L,
  49.  0x4A4D500CL, 0x41444307L, 0x524F5207L, 0x3F3F3F00L, 0x4256530BL, 0x41444306L,
  50.  0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444303L, 0x524F5203L, 0x3F3F3F00L,
  51.  0x53454900L, 0x41444309L, 0x3F3F3F00L, 0x3F3F3F00L, 0x3F3F3F00L, 0x41444308L,
  52.  0x524F5208L, 0x3F3F3F00L, 0X3F3F3F00L, 0X53544105L, 0X3F3F3F00L, 0X3F3F3F00L,
  53.  0X53545902L, 0X53544102L, 0X53545802L, 0X3F3F3F00L, 0X44455900L, 0X3F3F3F00L,
  54.  0X54584100L, 0X3F3F3F00L, 0X53545907L, 0X53544107L, 0X53545807L, 0X3F3F3F00L,
  55.  0X4243430BL, 0X53544106L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53545903L, 0X53544103L,
  56.  0X53545804L, 0X3F3F3F00L, 0X54594100L, 0X53544109L, 0X54585300L, 0X3F3F3F00L,
  57.  0X3F3F3F00L, 0X53544108L, 0X3F3F3F00L, 0X3F3F3F00L, 0X4C445901L, 0X4C444105L,
  58.  0X4C445801L, 0X3F3F3F00L, 0X4C445902L, 0X4C444102L, 0X4C445802L, 0X3F3F3F00L,
  59.  0X54415900L, 0X4C444101L, 0X54415800L, 0X3F3F3F00L, 0X4C445907L, 0X4C444107L,
  60.  0X4C445807L, 0X3F3F3F00L, 0X4243530BL, 0X4C444106L, 0X3F3F3F00L, 0X3F3F3F00L,
  61.  0X4C445903L, 0X4C444103L, 0X4C445804L, 0X3F3F3F00L, 0X434C5600L, 0X4C444109L,
  62.  0X54535800L, 0X3F3F3F00L, 0X4C445908L, 0X4C444108L, 0X4C445809L, 0X3F3F3F00L,
  63.  0X43505901L, 0X434D5005L, 0X3F3F3F00L, 0X3F3F3F00L, 0X43505902L, 0X434d5002L,
  64.  0X44454302L, 0X3F3F3F00L, 0X494E5900L, 0X434D5001L, 0X44455800L, 0X3F3F3F00L,
  65.  0X43505907L, 0X434D5007L, 0X44454307L, 0X3F3F3F00L, 0X424E450BL, 0X434D5006L,
  66.  0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5003L, 0X44454303L, 0X3F3F3F00L,
  67.  0X434C4400L, 0X434D5009L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X434D5008L,
  68.  0X44454308L, 0X3F3F3F00L, 0X43505801L, 0X53424305L, 0X3F3F3F00L, 0X3F3F3F00L,
  69.  0X43505802L, 0X53424302L, 0X494E4302L, 0X3F3F3F00L, 0X494E5800L, 0X53424301L,
  70.  0X4E4F5000L, 0X3F3F3F00L, 0X43505807L, 0X53424307L, 0X494E4307L, 0X3F3F3F00L,
  71.  0X4245510BL, 0X53424306L, 0X3F3F3F00L, 0X3F3F3F00L, 0X3F3F3F00L, 0X53424303L,
  72.  0X494E4303L, 0X3F3F3F00L, 0X53454400L, 0X53424309L, 0X3F3F3F00L, 0X3F3F3F00L,
  73.  0X3F3F3F00L, 0X53424308L, 0X494E4308L, 0X3F3F3F00L
  74.  } ;
  75.  
  76. /* create an array of pointers to 256 functions */
  77. int (*vec_6502[257])() =
  78.     {
  79.     op00, op01, op02, op03, op04, op05, op06, op07, op08, op09, op0A, op0B,
  80.     op0C, op0D, op0E, op0F, op10, op11, op12, op13, op14, op15, op16, op17,
  81.     op18, op19, op1A, op1B, op1C, op1D, op1E, op1F, op20, op21, op22, op23,
  82.     op24, op25, op26, op27, op28, op29, op2A, op2B, op2C, op2D, op2E, op2F,
  83.     op30, op31, op32, op33, op34, op35, op36, op37, op38, op39, op3A, op3B,
  84.     op3C, op3D, op3E, op3F, op40, op41, op42, op43, op44, op45, op46, op47,
  85.     op48, op49, op4A, op4B, op4C, op4D, op4E, op4F, op50, op51, op52, op53,
  86.     op54, op55, op56, op57, op58, op59, op5A, op5B, op5C, op5D, op5E, op5F,
  87.     op60, op61, op62, op63, op64, op65, op66, op67, op68, op69, op6A, op6B,
  88.     op6C, op6D, op6E, op6F, op70, op71, op72, op73, op74, op75, op76, op77,
  89.     op78, op79, op7A, op7B, op7C, op7D, op7E, op7F, op80, op81, op82, op83,
  90.     op84, op85, op86, op87, op88, op89, op8A, op8B, op8C, op8D, op8E, op8F,
  91.     op90, op91, op92, op93, op94, op95, op96, op97, op98, op99, op9A, op9B,
  92.     op9C, op9D, op9E, op9F, opA0, opA1, opA2, opA3, opA4, opA5, opA6, opA7,
  93.     opA8, opA9, opAA, opAB, opAC, opAD, opAE, opAF, opB0, opB1, opB2, opB3,
  94.     opB4, opB5, opB6, opB7, opB8, opB9, opBA, opBB, opBC, opBD, opBE, opBF,
  95.     opC0, opC1, opC2, opC3, opC4, opC5, opC6, opC7, opC8, opC9, opCA, opCB,
  96.     opCC, opCD, opCE, opCF, opD0, opD1, opD2, opD3, opD4, opD5, opD6, opD7,
  97.     opD8, opD9, opDA, opDB, opDC, opDD, opDE, opDF, opE0, opE1, opE2, opE3,
  98.     opE4, opE5, opE6, opE7, opE8, opE9, opEA, opEB, opEC, opED, opEE, opEF,
  99.     opF0, opF1, opF2, opF3, opF4, opF5, opF6, opF7, opF8, opF9, opFA, opFB,
  100.     opFC, opFD, opFE, opFF, opXX
  101.     };
  102.  
  103. void init_heap()
  104.     {
  105.     register long lToHeap;
  106.     int  iHeap=0;
  107.     register int opcode = 0;
  108.     register long lOpcode, lNextOp;
  109.  
  110. #ifdef NDEBUG
  111.     printf("vec_6502 = %6lx\nlEmul = %6lx\n", vec_6502, lEmul);
  112. #endif
  113.  
  114.     /* first blit the 256 opcodes */
  115.     do
  116.         {
  117.         lToHeap = lEmul + iHeap + cbDISPATCH;
  118.         lOpcode = (long)vec_6502[opcode];
  119.         lNextOp = (long)vec_6502[opcode+1];
  120. #ifdef NDEBUG
  121.         printf("Blit %d bytes, opcode %2x, from %6lx to %6lx\n",
  122.             (int)(lNextOp - lOpcode), opcode, lOpcode, lToHeap);
  123. #endif
  124.         Blitb(lOpcode, lToHeap,
  125.             (int)(lNextOp - lOpcode));
  126.  
  127.         Assert(((int)(lNextOp - lOpcode)) >= 0, "blitting negative");
  128.         Assert(((int)(lNextOp - lOpcode)) != 0, "blitting 0");
  129.         Assert(((int)(lNextOp - lOpcode)) < 122, "blitting >122");
  130.         
  131.         iHeap += 256;
  132.         opcode++;
  133.         } while (iHeap != 0); 
  134.  
  135.     /* then blit the dispatcher and interpreter globals */
  136. #ifdef NDEBUG
  137.     printf("\nBlit %d bytes of globals from %6lx to %6lx\n",
  138.         cbGLOBALS, Lglobals, lEmul - cbGLOBALS); 
  139. #endif
  140.     Blitb(Lglobals, lEmul - cbGLOBALS, cbGLOBALS);
  141. #ifdef NDEBUG
  142.     printf("Blit %d bytes of dispatcher from %6lx to %6lx\n",
  143.         cbDISPATCH, Lemul, lEmul); 
  144. #endif
  145.     Blitb(Lemul, lEmul, cbDISPATCH);
  146.     
  147.     /* now fill in important globals */
  148. asm
  149.     {
  150. ; set up interrupt vector
  151.     move.l  lEmul,A0
  152.     lea     lInterrupt(A0),A0
  153.     move.w  #OP_JMP,(A0)
  154.     }
  155.     }
  156.  
  157. /********************************************************************
  158. **
  159. ** This is the main entry point into the interpreter.
  160. ** At entry, all 6502 registers must already be properly initialized.
  161. ** This routine must be called in supervisor mode.
  162. **
  163. ********************************************************************/
  164.  
  165. execute()
  166.     {
  167.  
  168.     if (!fTrace)
  169.         {
  170. #ifdef DEBUG
  171.         Setscreen(lScr+3840L, lScr+3840L, -1);
  172. #else
  173.         Setscreen(-1L, lScr+3840L, -1);
  174. #endif
  175.         if (!fIsMono)
  176.             *(char *)0xFFFF8260L = 0;
  177.  
  178.         (*pHookIn)();
  179.         }
  180.  
  181. #ifdef NDEBUG
  182.     printf("execute(): hooked in!\n");
  183. #endif
  184.  
  185. asm {
  186.  
  187. ; copy important registers into interpreter's area
  188.     move.l  lEmul,arEMUL
  189.  
  190. ; restore both instruction words of dispatcher
  191.     move.l  Lemul,(arEMUL)
  192.  
  193. ; patch up the dispatcher if trace is on
  194.     tst.w   fTrace
  195.     beq.s   notrace             ; if trace bit set...
  196.     move.w  #OP_RTS,(arEMUL)    ; make dispatcher RTS after 1 opcode
  197. notrace:
  198.  
  199. ; fill in remaining interpreter registers
  200.     lea     4(arEMUL),arEMVEC
  201.     move.l  lMemory,drEA
  202.     move.l  drEA,drSP   ; set high word
  203.     move.l  drEA,drEA   ; set high word
  204.     move.l  drEA,drA    ; ditto
  205.     move.l  drEA,drX    ; ditto
  206.     move.l  drEA,drY    ; ditto
  207. ;    move.l  drEA,drST   ; ditto
  208.     move.l  lRStat,arRSTAT
  209.     move.l  lWStat,arWSTAT
  210.  
  211. ; convert P register to drST etc...
  212.     P_to_ST
  213.  
  214. ; load remaining 6502 registers
  215.     move.b  bRegA(arEMUL),drA
  216.     move.b  bRegX(arEMUL),drX
  217.     move.b  bRegY(arEMUL),drY
  218.     move.w  wRegPC(arEMUL),drEA
  219.     move.l  drEA,arPC
  220.  
  221. ; stack is on page 1
  222.     move.b  #0x01,wRegSP(arEMUL)
  223.     move.w  wRegSP(arEMUL),drSP
  224.     
  225. ; clear all interrupts
  226.     clr.b   bNMI(arEMUL)
  227.     clr.b   bIRQ(arEMUL)
  228.  
  229. ; the dispatch routine is not called directly, in case we patched
  230. ; an RTS into it. So execute the first instruction from here
  231.     move.b  (arPC)+,(arEMVEC)
  232.     jsr     2(arEMUL)           ; go emulate!!
  233.  
  234.     move.b  drA,bRegA(arEMUL)   ; save 6502 registers
  235.     move.b  drX,bRegX(arEMUL)
  236.     move.b  drY,bRegY(arEMUL)
  237.     move.w  drSP,wRegSP(arEMUL)
  238.     move.w  arPC,wRegPC(arEMUL)
  239.     move.w  arEA,wEA(arEMUL)
  240.  
  241.     ST_to_P
  242.     }
  243.  
  244.     if (!fTrace)
  245.         {
  246. #ifdef DEBUG
  247.         Setscreen(lScrGEM, lScrGEM, -1);
  248. #else
  249.         Setscreen(-1L, lScrGEM, -1);
  250. #endif
  251.         if (!fIsMono)
  252.             *(char *)0xFFFF8260L = 1;
  253.  
  254.        (*pUnHook)();
  255.        }
  256.     }
  257.  
  258.  
  259. /* this function contains all of the 6502 related code
  260. ** that will be relocated to the heap.
  261. */
  262.   
  263. pcode()
  264.     {
  265. asm {
  266.  
  267. ; The bytes immediately preceeding the dispatch routine are used as
  268. ; the global variable area for the interpreter and service routines,
  269. ; and is the link through which we communicate to the monitor.
  270. ; This must be blitted as a whole to the heap.
  271. ; Offsets in _X6502.H must match up with the declarations here.
  272.  
  273. Lglobals:
  274.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 16 jump vectors
  275.     dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0     ; save space for D0-D7,A0-A5
  276.     dc.b    0   ; NMI interrupt bits
  277.     dc.b    0   ; IRQ interrupt bits
  278.     dc.b    0   ; IRQ enable mask
  279.     dc.b    0   ; bB
  280.     dc.b    0   ; bD
  281.     dc.b    0   ; bI
  282.     dc.b    0   ; bV
  283.     dc.b    0   ; bCX
  284.     dc.b    0   ; bRegA
  285.     dc.b    0   ; bRegX
  286.     dc.b    0   ; bRegY
  287.     dc.b    0   ; bRegP
  288.     dc.w    0   ; wRegSP
  289.     dc.w    0   ; wRegPC
  290.     dc.w    0   ; wEA
  291.     dc.w    0   ; wExitCode
  292.  
  293. LInterrupt:
  294.     dc.w    0   ; jmp
  295. LIntVec:
  296.     dc.l    0   ; NMI and IRQ routine
  297.  
  298. LWriteDisp:
  299.     move.b  drDATA,-10(arEMUL)
  300.     jmp     iWrite(arEMUL)
  301.  
  302. LReadDisp:
  303.     move.b  drDATA,-2(arEMUL)
  304.     jmp     iRead(arEMUL)
  305.  
  306. Lemul:
  307.     move.b  (arPC)+,(arEMVEC)
  308.     jmp     2(PC)
  309.  
  310. ; BRK
  311. op00:
  312.     UNUSED   
  313. ;    st      bB(arEMUL)
  314. ;    move.w  #EXIT_BREAK,wExitCode(arEMUL)
  315. ;    rts
  316.  
  317. ; ORA (zp,X)
  318. op01:
  319.     EA_zpXind
  320.     ReadService
  321.     or.b    (arEA),drA      ; ORA with accumualtor
  322.     move.b  drA,drST
  323.     ext.w   drST
  324.     DISPATCH                ; and go do another opcode
  325.  
  326. op02:
  327.     UNUSED
  328. op03:
  329.     UNUSED
  330. op04:
  331.     UNUSED
  332.     
  333. ; ORA zp
  334. op05:
  335.     EA_zp
  336.     or.b    (arEA),drA       ; ORA with accumualtor
  337.     move.b  drA,drST
  338.     ext.w   drST
  339.     DISPATCH
  340.  
  341. ; ASL zp
  342. op06:
  343.     EA_zp
  344.     move.b  (arEA),drST    ; must do in register as memory shifts word
  345.     add.b   drST,drST
  346.     scs     drC
  347.     ext.w   drST
  348.     move.b  drST,(arEA)
  349.     DISPATCH
  350.  
  351. op07:
  352.     UNUSED
  353.  
  354. ; PHP - do a 68000 to 6502 flag conversion, like in the init code
  355. op08:
  356.     ST_to_P
  357.     move.l  drSP,arEA
  358.     move.b  bRegP(arEMUL),(arEA)
  359.     subq.b  #1,drSP
  360.     DISPATCH
  361.  
  362. ; ORA #
  363. op09:
  364.     or.b    (arPC)+,drA
  365.     move.b  drA,drST
  366.     ext.w   drST
  367.     DISPATCH
  368.  
  369. ; ASL A
  370. op0A:
  371.     add.b   drA,drA
  372.     scs     drC
  373.     move.b  drA,drST
  374.     ext.w   drST
  375.     DISPATCH
  376.  
  377. op0B:
  378.     UNUSED
  379. op0C:
  380.     UNUSED
  381.  
  382. ; ORA abs
  383. op0D:
  384.     EA_abs
  385.     ReadService
  386.     or.b    (arEA),drA      ; ORA with accumualtor
  387.     move.b  drA,drST
  388.     ext.w   drST
  389.     DISPATCH                ; and go do another opcode
  390.  
  391. ; ASL abs
  392. op0E:
  393.     EA_abs
  394.     ReadService
  395.     move.b  (arEA),drST   ; must do in register as memory shifts word
  396.     add.b   drST,drST
  397.     scs     drC
  398.     ext.w   drST
  399.     move.b  drST,(arEA)
  400.     DISPATCH
  401.  
  402. op0F:
  403.     UNUSED
  404.  
  405. ; BPL
  406. op10:
  407.     move.b  (arPC)+,drDATA
  408.     tst.w   drST
  409.     bmi.s   nobpl
  410.     ext.w   drDATA
  411.     adda.w  drDATA,arPC
  412. nobpl:
  413.     DISPATCH
  414.  
  415. ; ORA (zp),Y
  416. op11:
  417.     EA_zpYind
  418.     ReadService
  419.     or.b    (arEA),drA
  420.     move.b  drA,drST
  421.     ext.w   drST
  422.     DISPATCH
  423.  
  424. op12:
  425.     UNUSED
  426. op13:
  427.     UNUSED
  428. op14:
  429.     UNUSED
  430.  
  431. ; ORA zp,X
  432. op15:
  433.     EA_zpX
  434.     or.b    (arEA),drA
  435.     move.b  drA,drST
  436.     ext.w   drST
  437.     DISPATCH
  438.  
  439. ; ASL zp,X
  440. op16:
  441.     EA_zpX
  442.     move.b  (arEA),drST     ; must do in register as memory shifts word
  443.     add.b   drST,drST
  444.     scs     drC
  445.     ext.w   drST
  446.     move.b  drST,(arEA)
  447.     DISPATCH
  448.  
  449. op17:
  450.     UNUSED
  451.     
  452. ; CLC
  453. op18:
  454.     clr.b    drC
  455.     DISPATCH
  456.  
  457. ; ORA abs,Y
  458. op19:
  459.     EA_absY
  460.     ReadService
  461.     or.b    (arEA),drA
  462.     move.b  drA,drST
  463.     ext.w   drST
  464.     DISPATCH
  465.  
  466. op1A:
  467.     UNUSED
  468. op1B:
  469.     UNUSED
  470. op1C:
  471.     UNUSED
  472.  
  473. ; ORA abs,X
  474. op1D:
  475.     EA_absX
  476.     ReadService
  477.     or.b    (arEA),drA
  478.     move.b  drA,drST
  479.     ext.w   drST
  480.     DISPATCH
  481.  
  482. ; ASL abs,X
  483. op1E:
  484.     EA_absX
  485.     ReadService
  486.     move.b  (arEA),drST   ; must do in register as memory shifts word
  487.     add.b   drST,drST
  488.     scs     drC
  489.     ext.w   drST
  490.     move.b  drST,(arEA)
  491.     DISPATCH
  492.  
  493. op1F:
  494.     UNUSED
  495.  
  496. ; JSR abs
  497. op20:
  498.     subq.b  #2,drSP
  499.     move.l  drSP,arEA
  500.     move.w  arPC,drEA
  501.     addq.w  #1,drEA
  502.     move.b  drEA,1(arEA)    ; push PClo
  503.     move.w  drEA,-(SP)
  504.     move.b  (SP)+,2(arEA)   ; push PChi
  505.     dc.w    0x0F09,0x0001   ; movep.w 1(arPC),drEA
  506.     move.b  (arPC),drEA
  507.     move.l  drEA,arPC
  508.     DISPATCH
  509.  
  510. ; AND (zp,X)
  511. op21:
  512.     EA_zpXind
  513.     ReadService
  514.     and.b   (arEA),drA
  515.     move.b  drA,drST
  516.     ext.w   drST
  517.     DISPATCH
  518.  
  519. op22:
  520.     UNUSED
  521. op23:
  522.     UNUSED
  523.  
  524. ; BIT zp
  525. op24:
  526.     EA_zp
  527.     move.b  (arEA),drST
  528.     ext.w   drST
  529. ;    tst.b   drDATA         ; V bit not set by a tst
  530.     btst    #6,drST
  531.     sne     bV(arEMUL)      ; V bit
  532.     and.b   drA,drST        ; NZ bits
  533.     DISPATCH
  534.  
  535. ; AND zp
  536. op25:
  537.     EA_zp
  538.     and.b   (arEA),drA
  539.     move.b  drA,drST
  540.     ext.w   drST
  541.     DISPATCH
  542.  
  543. ; ROL zp
  544. op26:
  545.     EA_zp
  546.     move.b  (arEA),drST     ; get byte
  547.     add.b   drC,drC
  548.     addx.b  drST,drST       ; shift it
  549.     scs     drC
  550.     ext.w   drST
  551.     move.b  drST,(arEA)   ; save in memory
  552.     DISPATCH
  553.  
  554. op27:
  555.     UNUSED 
  556.  
  557. ; PLP
  558. op28:
  559.     addq.b  #1,drSP
  560.     move.l  drSP,arEA
  561.     move.b  (arEA),bRegP(arEMUL)
  562.     P_to_ST
  563.     DISPATCH
  564.  
  565. ; AND #
  566. op29:
  567.     and.b   (arPC)+,drA
  568.     move.b  drA,drST
  569.     ext.w   drST
  570.     DISPATCH
  571.  
  572. ; ROL A
  573. op2A:
  574.     add.b   drC,drC
  575.     addx.b  drA,drA
  576.     scs     drC
  577.     move.b  drA,drST
  578.     ext.w   drST
  579.     DISPATCH
  580.  
  581. op2B:
  582.     UNUSED
  583.  
  584. ; BIT abs
  585. op2C:
  586.     EA_abs
  587.     ReadService
  588.     move.b  (arEA),drST
  589.     ext.w   drST
  590. ;    tst.b   drDATA         ; V bit not set by a tst
  591.     btst    #6,drST
  592.     sne     bV(arEMUL)      ; V bit
  593.     and.b   drA,drST        ; NZ bits
  594.     DISPATCH
  595.  
  596. ; AND abs
  597. op2D:
  598.     EA_abs
  599.     ReadService
  600.     and.b   (arEA),drA
  601.     move.b  drA,drST
  602.     ext.w   drST
  603.     DISPATCH
  604.  
  605. ; ROL abs
  606. op2E:
  607.     EA_abs
  608.     ReadService
  609.     move.b  (arEA),drST     ; get byte
  610.     add.b   drC,drC
  611.     addx.b  drST,drST       ; shift it
  612.     scs     drC
  613.     ext.w   drST
  614.     move.b  drST,(arEA)     ; save in memory
  615.     DISPATCH
  616.  
  617. op2F:
  618.     UNUSED
  619.  
  620. ; BMI
  621. op30:
  622.     move.b  (arPC)+,drDATA
  623.     tst.w   drST
  624.     bpl.s   nobmi
  625.     ext.w   drDATA
  626.     adda.w  drDATA,arPC
  627. nobmi:
  628.     DISPATCH
  629.  
  630. ; AND (zp),Y
  631. op31:
  632.     EA_zpYind
  633.     ReadService
  634.     and.b   (arEA),drA
  635.     move.b  drA,drST
  636.     ext.w   drST
  637.     DISPATCH
  638.  
  639. op32:
  640.     UNUSED
  641. op33:
  642.     UNUSED
  643. op34:
  644.     UNUSED
  645.  
  646.  
  647. ; AND zp,X
  648. op35:
  649.     EA_zpX
  650.     and.b   (arEA),drA
  651.     move.b  drA,drST
  652.     ext.w   drST
  653.     DISPATCH
  654.  
  655. ; ROL zp,X
  656. op36:
  657.     EA_zpX
  658.     move.b  (arEA),drST     ; get byte
  659.     add.b   drC,drC
  660.     addx.b  drST,drST       ; shift it
  661.     scs     drC
  662.     ext.w   drST
  663.     move.b  drST,(arEA)       ; save in memory
  664.     DISPATCH
  665.  
  666. op37:
  667.     UNUSED
  668.  
  669. ; SEC
  670. op38:
  671.     st      drC
  672.     DISPATCH
  673.  
  674. ; AND abs,Y
  675. op39:
  676.     EA_absY
  677.     ReadService
  678.     and.b   (arEA),drA
  679.     move.b  drA,drST
  680.     ext.w   drST
  681.     DISPATCH
  682.  
  683. op3A:
  684.     UNUSED
  685. op3B:
  686.     UNUSED
  687. op3C:
  688.     UNUSED
  689.  
  690. ; AND abs,X
  691. op3D:
  692.     EA_absX
  693.     ReadService
  694.     and.b   (arEA),drA
  695.     move.b  drA,drST
  696.     ext.w   drST
  697.     DISPATCH
  698.  
  699. ; ROL abs,X
  700. op3E:
  701.     EA_absX
  702.     ReadService
  703.     move.b  (arEA),drST     ; get byte
  704.     add.b   drC,drC
  705.     addx.b  drST,drST       ; shift it
  706.     scs     drC
  707.     ext.w   drST
  708.     move.b  drST,(arEA)     ; save in memory
  709.     DISPATCH
  710.  
  711. op3F:
  712.     UNUSED
  713.  
  714. ; RTI
  715. op40:
  716.     move.l  drSP,arEA
  717.     move.b  3(arEA),-(SP)       ; pull PChi
  718.     move.w  (SP)+,drEA
  719.     move.b  2(arEA),drEA        ; pull PClo
  720.     move.l  drEA,arPC           ; do NOT increment PC for an RTI
  721.     move.b  1(arEA),bRegP(arEMUL)   ; pull processor
  722.     P_to_ST
  723.     addq.b  #3,drSP
  724.  
  725.     tst.b   bNMI(arEMUL)        ; check if NMI pending
  726.     bne     op40_2
  727.  
  728.     tst.b   bI(arEMUL)
  729.     bne     op40_x
  730.  
  731.     tst.b   bIRQ(arEMUL)        ; check if other interrupts pending
  732.     beq     op40_x
  733.  
  734. op40_2:
  735.     move.w  #OP_INT,(arEMUL)
  736.  
  737. op40_x:
  738.     DISPATCH
  739.  
  740. ; EOR (zp,X)
  741. op41:
  742.     EA_zpXind
  743.     ReadService
  744.     move.b  (arEA),drDATA
  745.     eor.b   drDATA,drA
  746.     move.b  drA,drST
  747.     ext.w   drST
  748.     DISPATCH
  749.  
  750. op42:
  751.     UNUSED
  752. op43:
  753.     UNUSED
  754. op44:
  755.     UNUSED
  756.  
  757. ; EOR zp
  758. op45:
  759.     EA_zp
  760.     move.b  (arEA),drDATA
  761.     eor.b   drDATA,drA
  762.     move.b  drA,drST
  763.     ext.w   drST
  764.     DISPATCH
  765.  
  766. ; LSR zp
  767. op46:
  768.     EA_zp
  769.     move.b   (arEA),drST
  770.     lsr.b    #1,drST
  771.     scs     drC
  772.     ext.w   drST
  773.     move.b   drST,(arEA)
  774.     DISPATCH
  775.  
  776. op47:
  777.     UNUSED
  778.  
  779. ; PHA
  780. op48:
  781.     move.l  drSP,arEA
  782.     move.b  drA,(arEA)      ; push acc
  783.     subq.b  #1,drSP
  784.     DISPATCH
  785.  
  786. ; EOR #
  787. op49:
  788.     move.b  (arPC)+,drDATA
  789.     eor.b   drDATA,drA
  790.     move.b  drA,drST
  791.     ext.w   drST
  792.     DISPATCH
  793.  
  794. ; LSR A
  795. op4A:
  796.     lsr.b   #1,drA
  797.     scs     drC
  798.     move.b  drA,drST
  799.     ext.w   drST
  800.     DISPATCH
  801.  
  802. op4B:
  803.     UNUSED
  804.  
  805. ; JMP abs
  806. op4C:
  807.     dc.w    0x0F09,0x0001   ; movep.w 1(arPC),drEA
  808.     move.b  (arPC),drEA
  809.     move.l  drEA,arPC
  810.     DISPATCH
  811.  
  812. ; EOR abs
  813. op4D:
  814.     EA_abs
  815.     ReadService
  816.     move.b  (arEA),drDATA
  817.     eor.b   drDATA,drA
  818.     move.b  drA,drST
  819.     ext.w   drST
  820.     DISPATCH
  821.  
  822. ; LSR abs
  823. op4E:
  824.     EA_abs
  825.     ReadService
  826.     move.b   (arEA),drST
  827.     lsr.b    #1,drST
  828.     scs     drC
  829.     ext.w   drST
  830.     move.b   drST,(arEA)
  831.     DISPATCH
  832.  
  833. op4F:
  834.     UNUSED
  835.  
  836. ; BVC
  837. op50:
  838.     move.b  (arPC)+,drDATA
  839.     tst.b   bV(arEMUL)
  840.     bne.s   nobvc
  841.     ext.w   drDATA
  842.     adda.w  drDATA,arPC
  843. nobvc:
  844.     DISPATCH
  845.  
  846. ; EOR (zp),Y
  847. op51:
  848.     EA_zpYind
  849.     ReadService
  850.     move.b  (arEA),drDATA
  851.     eor.b   drDATA,drA
  852.     move.b  drA,drST
  853.     ext.w   drST
  854.     DISPATCH
  855.  
  856. op52:
  857.     UNUSED
  858. op53:
  859.     UNUSED
  860. op54:
  861.     UNUSED
  862.  
  863. ; EOR zp,X
  864. op55:
  865.     EA_zpX
  866.     move.b  (arEA),drDATA
  867.     eor.b   drDATA,drA
  868.     move.b  drA,drST
  869.     ext.w   drST
  870.     DISPATCH
  871.  
  872. ; LSR zp,X
  873. op56:
  874.     EA_zpX
  875.     move.b   (arEA),drST
  876.     lsr.b    #1,drST
  877.     scs     drC
  878.     ext.w   drST
  879.     move.b   drST,(arEA)
  880.     DISPATCH
  881.  
  882. op57:
  883.     UNUSED
  884.  
  885. ; CLI
  886. op58:
  887.     sf      bI(arEMUL)
  888.  
  889.     tst.b   bIRQ(arEMUL)        ; check if other interrupts pending
  890.     beq     op58_x
  891.  
  892.     move.w  #OP_INT,(arEMUL)
  893.  
  894. op58_x:
  895.     DISPATCH
  896.  
  897. ; EOR abs,Y
  898. op59:
  899.     EA_absY
  900.     ReadService
  901.     move.b  (arEA),drDATA
  902.     eor.b   drDATA,drA
  903.     move.b  drA,drST
  904.     ext.w   drST
  905.     DISPATCH
  906.  
  907. op5A:
  908.     UNUSED
  909. op5B:
  910.     UNUSED
  911. op5C:
  912.     UNUSED
  913.  
  914. ; EOR abs,X
  915. op5D:
  916.     EA_absX
  917.     ReadService
  918.     move.b  (arEA),drDATA
  919.     eor.b   drDATA,drA
  920.     move.b  drA,drST
  921.     ext.w   drST
  922.     DISPATCH
  923.  
  924. ; LSR abs,X
  925. op5E:
  926.     EA_absX
  927.     ReadService
  928.     move.b   (arEA),drST
  929.     lsr.b    #1,drST
  930.     scs     drC
  931.     ext.w   drST
  932.     move.b   drST,(arEA)
  933.     DISPATCH
  934.  
  935. op5F:
  936.     UNUSED
  937.  
  938. ; RTS
  939. op60:
  940.     move.l  drSP,arEA
  941.     move.b  2(arEA),-(SP)  ; pull PChi
  942.     move.w  (SP)+,drEA
  943.     move.b  1(arEA),drEA  ; pull PClo
  944.     addq.b  #2,drSP
  945.     addq.w  #1,drEA
  946.     move.l  drEA,arPC
  947.     DISPATCH
  948.  
  949. ; ADC (zp,X)
  950. op61:
  951.     tst.l   drST        ; test D flag
  952.     bmi.s   op61dec
  953.     EA_zpXind
  954.     ReadService
  955.     move.b  (arEA),drDATA
  956.     add.b   drC,drC
  957.     addx.b  drDATA,drA
  958.     scs     drC
  959.     svs     bV(arEMUL)
  960.     move.b  drA,drST
  961.     ext.w   drST
  962.     DISPATCH
  963. op61dec:
  964.     EA_zpXind
  965.     ReadService
  966.     move.b  (arEA),drDATA
  967.     add.b   drC,drC     ; set X flag
  968.     clr.b   drC         ; sets Z flag for the ABCD without clearing X
  969.     abcd    drDATA,drA
  970.     scs     drC
  971.     svs     bV(arEMUL)
  972.     move.b  drA,drST
  973.     ext.w   drST
  974.     DISPATCH
  975.  
  976. op62:
  977.     UNUSED
  978. op63:
  979.     UNUSED
  980. op64:
  981.     UNUSED
  982.  
  983. ; ADC zp
  984. op65:
  985.     tst.l   drST        ; test D flag
  986. ;    tst.b   bD(arEMUL)
  987.     bmi.s   op65dec
  988.     EA_zp
  989.     move.b  (arEA),drDATA
  990.     add.b   drC,drC
  991.     addx.b  drDATA,drA
  992.     scs     drC
  993.     svs     bV(arEMUL)
  994.     move.b  drA,drST
  995.     ext.w   drST
  996.     DISPATCH
  997. op65dec:
  998.     EA_zp
  999.     move.b  (arEA),drDATA
  1000.     add.b   drC,drC     ; set X flag
  1001.     clr.b   drC         ; sets Z flag for the ABCD without clearing X
  1002.     abcd    drDATA,drA
  1003.     scs     drC
  1004.     svs     bV(arEMUL)
  1005.     move.b  drA,drST
  1006.     ext.w   drST
  1007.     DISPATCH
  1008.  
  1009. ; ROR zp
  1010. op66:
  1011.     EA_zp
  1012.     move.b  (arEA),drST
  1013.     add.b   drC,drC
  1014.     roxr.b  #1,drST
  1015.     scs     drC
  1016.     ext.w   drST
  1017.     move.b  drST,(arEA)
  1018.     DISPATCH
  1019.  
  1020. op67:
  1021.     UNUSED
  1022.  
  1023. ; PLA
  1024. op68:
  1025.     addq.b  #1,drSP
  1026.     move.l  drSP,arEA
  1027.     move.b  (arEA),drA
  1028.     move.b  drA,drST
  1029.     ext.w   drST
  1030.     DISPATCH
  1031.  
  1032. ; ADC #
  1033. op69:
  1034.     tst.l   drST        ; test D flag
  1035. ;    tst.b   bD(arEMUL)
  1036.     bmi.s   op69dec
  1037.     move.b  (arPC)+,drDATA
  1038.     add.b   drC,drC
  1039.     addx.b  drDATA,drA
  1040.     scs     drC
  1041.     svs     bV(arEMUL)
  1042.     move.b  drA,drST
  1043.     ext.w   drST
  1044.     DISPATCH
  1045. op69dec:
  1046.     move.b  (arPC)+,drDATA
  1047.     add.b   drC,drC     ; set X flag
  1048.     clr.b   drC         ; sets Z flag for the ABCD without clearing X
  1049.     abcd    drDATA,drA
  1050.     scs     drC
  1051.     svs     bV(arEMUL)
  1052.     move.b  drA,drST
  1053.     ext.w   drST
  1054.     DISPATCH
  1055.  
  1056. ; ROR A
  1057. op6A:
  1058.     add.b   drC,drC
  1059.     roxr.b  #1,drA
  1060.     scs     drC
  1061.     move.b  drA,drST
  1062.     ext.w   drST
  1063.     DISPATCH
  1064.  
  1065. op6B:
  1066.     UNUSED
  1067.  
  1068. ; JMP (abs)
  1069. op6C:
  1070.     EA_abs
  1071.     dc.w    0x0F08,0x0001   ; movep.w 1(arEA),drEA
  1072.     move.b  (arEA),drEA
  1073.     move.l  drEA,arPC
  1074.     DISPATCH
  1075.  
  1076. ; ADC abs
  1077. op6D:
  1078.     EA_abs
  1079.     ReadService
  1080.     tst.l   drST        ; test D flag
  1081. ;    tst.b   bD(arEMUL)
  1082.     bmi.s   op6Ddec
  1083.     move.b  (arEA),drDATA
  1084.     add.b   drC,drC
  1085.     addx.b  drDATA,drA
  1086.     scs     drC
  1087.     svs     bV(arEMUL)
  1088.     move.b  drA,drST
  1089.     ext.w   drST
  1090.     DISPATCH
  1091. op6Ddec:
  1092.     move.b  (arEA),drDATA
  1093.     add.b   drC,drC     ; set X flag
  1094.     clr.b   drC         ; sets Z flag for the ABCD without clearing X
  1095.     abcd    drDATA,drA      ; ADDX.B or ABCD drDATA,drA
  1096.     scs     drC
  1097.     svs     bV(arEMUL)
  1098.     move.b  drA,drST
  1099.     ext.w   drST
  1100.     DISPATCH
  1101.  
  1102. ; ROR abs
  1103. op6E:
  1104.     EA_abs
  1105.     ReadService
  1106.     add.b   drC,drC
  1107.     move.b  (arEA),drST
  1108.     roxr.b   #1,drST
  1109.     scs     drC
  1110.     ext.w   drST
  1111.     move.b  drST,(arEA)
  1112.     DISPATCH
  1113.  
  1114. op6F:
  1115.     UNUSED
  1116.  
  1117. ; BVS
  1118. op70:
  1119.     move.b  (arPC)+,drDATA
  1120.     tst.b   bV(arEMUL)
  1121.     beq.s   nobvs
  1122.     ext.w   drDATA
  1123.     adda.w  drDATA,arPC
  1124. nobvs:
  1125.     DISPATCH
  1126.  
  1127. ; ADC (zp),Y
  1128. op71:
  1129.     EA_zpYind
  1130.     ReadService
  1131.     tst.l   drST        ; test D flag
  1132. ;    tst.b   bD(arEMUL)
  1133.     bmi.s   op71dec
  1134.     move.b  (arEA),drDATA
  1135.     add.b   drC,drC
  1136.     addx.b  drDATA,drA
  1137.     scs     drC
  1138.     svs     bV(arEMUL)
  1139.     move.b  drA,drST
  1140.     ext.w   drST
  1141.     DISPATCH
  1142. op71dec:
  1143.     move.b  (arEA),drDATA
  1144.     add.b   drC,drC     ; set X flag
  1145.     clr.b   drC         ; sets Z flag for the ABCD without clearing X
  1146.     abcd    drDATA,drA
  1147.     scs     drC
  1148.     svs     bV(arEMUL)
  1149.     move.b  drA,drST
  1150.     ext.w   drST
  1151.     DISPATCH
  1152.  
  1153. op72:
  1154.     UNUSED
  1155. op73:
  1156.     UNUSED
  1157. op74:
  1158.     UNUSED
  1159.  
  1160. ; ADC zp,X
  1161. op75:
  1162.     EA_zpX
  1163.     tst.l   drST        ; test D flag
  1164. ;    tst.b   bD(arEMUL)
  1165.     bmi.s   op75dec
  1166.     move.b  (arEA),drDATA
  1167.     add.b   drC,drC
  1168.     addx.b  drDATA,drA
  1169.     scs     drC
  1170.     svs     bV(arEMUL)
  1171.     move.b  drA,drST
  1172.     ext.w   drST
  1173.     DISPATCH
  1174. op75dec:
  1175.     move.b  (arEA),drDATA
  1176.     add.b   drC,drC     ; set X flag
  1177.     clr.b   drC         ; sets Z flag for the ABCD without clearing X
  1178.     abcd    drDATA,drA
  1179.     scs     drC
  1180.     svs     bV(arEMUL)
  1181.     move.b  drA,drST
  1182.     ext.w   drST
  1183.     DISPATCH
  1184.  
  1185. ; ROR zp,X
  1186. op76:
  1187.     EA_zpX
  1188.     add.b   drC,drC
  1189.     move.b   (arEA),drST
  1190.     roxr.b   #1,drST
  1191.     scs     drC
  1192.     ext.w   drST
  1193.     move.b   drST,(arEA)
  1194.     DISPATCH
  1195.  
  1196. op77:
  1197.     UNUSED
  1198.  
  1199. ; SEI
  1200. op78:
  1201.     st      bI(arEMUL)
  1202.     DISPATCH
  1203.  
  1204. ; ADC abs,Y
  1205. op79:
  1206.     EA_absY
  1207.     ReadService
  1208.     tst.l   drST        ; test D flag
  1209. ;    tst.b   bD(arEMUL)
  1210.     bmi.s   op79dec
  1211.     move.b  (arEA),drDATA
  1212.     add.b   drC,drC
  1213.     addx.b  drDATA,drA
  1214.     scs     drC
  1215.     svs     bV(arEMUL)
  1216.     move.b  drA,drST
  1217.     ext.w   drST
  1218.     DISPATCH
  1219. op79dec:    
  1220.     move.b  (arEA),drDATA
  1221.     add.b   drC,drC     ; set X flag
  1222.     clr.b   drC         ; sets Z flag for the ABCD without clearing X
  1223.     abcd    drDATA,drA      ; ADDX.B or ABCD drDATA,drA
  1224.     scs     drC
  1225.     svs     bV(arEMUL)
  1226.     move.b  drA,drST
  1227.     ext.w   drST
  1228.     DISPATCH
  1229.  
  1230. op7A:
  1231.     UNUSED
  1232. op7B:
  1233.     UNUSED
  1234. op7C:
  1235.     UNUSED
  1236.  
  1237. ; ADC abs,X
  1238. op7D:
  1239.     EA_absX
  1240.     ReadService
  1241.     tst.l   drST        ; test D flag
  1242. ;    tst.b   bD(arEMUL)
  1243.     bmi.s   op7Ddec
  1244.     move.b  (arEA),drDATA
  1245.     add.b   drC,drC
  1246.     addx.b  drDATA,drA
  1247.     scs     drC
  1248.     svs     bV(arEMUL)
  1249.     move.b  drA,drST
  1250.     ext.w   drST
  1251.     DISPATCH
  1252. op7Ddec:
  1253.     move.b  (arEA),drDATA
  1254.     add.b   drC,drC     ; set X flag
  1255.     clr.b   drC         ; sets Z flag for the ABCD without clearing X
  1256.     abcd    drDATA,drA
  1257.     scs     drC
  1258.     svs     bV(arEMUL)
  1259.     move.b  drA,drST
  1260.     ext.w   drST
  1261.     DISPATCH
  1262.  
  1263. ; ROR abs,X
  1264. op7E:
  1265.     EA_absX
  1266.     ReadService
  1267.     add.b   drC,drC
  1268.     move.b   (arEA),drST
  1269.     roxr.b   #1,drST
  1270.     scs     drC
  1271.     ext.w   drST
  1272.     move.b   drST,(arEA)
  1273.     DISPATCH
  1274.  
  1275. op7F:
  1276.     UNUSED
  1277. op80:
  1278.     UNUSED
  1279.  
  1280. ; STA (zp,X)
  1281. op81:
  1282.     EA_zpXind
  1283.     WriteAService
  1284.     move.b  drA,(arEA)
  1285.     DISPATCH
  1286.  
  1287. op82:
  1288.     UNUSED
  1289. op83:
  1290.     UNUSED
  1291.  
  1292. ; STY zp
  1293. op84:
  1294.     EA_zp
  1295.     move.b  drY,(arEA)
  1296.     DISPATCH
  1297.  
  1298. ; STA zp
  1299. op85:
  1300.     EA_zp
  1301.     move.b  drA,(arEA)
  1302.     DISPATCH
  1303.  
  1304. ; STX zp
  1305. op86:
  1306.     EA_zp
  1307.     move.b  drX,(arEA)
  1308.     DISPATCH
  1309.  
  1310. op87:
  1311.     UNUSED
  1312.  
  1313. ; DEY
  1314. op88:
  1315.     subq.b  #1,drY
  1316.     move.b  drY,drST
  1317.     ext.w   drST
  1318.     DISPATCH
  1319.  
  1320. op89:
  1321.     UNUSED
  1322.  
  1323. ; TXA
  1324. op8A:
  1325.     move.b  drX,drA
  1326.     move.b  drA,drST
  1327.     ext.w   drST
  1328.     DISPATCH
  1329.  
  1330. op8B:
  1331.     UNUSED
  1332.  
  1333. ; STY abs
  1334. op8C:
  1335.     EA_abs
  1336.     WriteYService
  1337.     move.b  drY,(arEA)
  1338.     DISPATCH
  1339.  
  1340. ; STA abs
  1341. op8D:
  1342.     EA_abs
  1343.     WriteAService
  1344.     move.b  drA,(arEA)
  1345.     DISPATCH
  1346.  
  1347. ; STX abs
  1348. op8E:
  1349.     EA_abs
  1350.     WriteXService
  1351.     move.b  drX,(arEA)
  1352.     DISPATCH
  1353.  
  1354. op8F:
  1355.     UNUSED
  1356.  
  1357. ; BCC
  1358. op90:
  1359.     move.b  (arPC)+,drDATA
  1360.     tst.b   drC
  1361.     bne.s   nobcc
  1362.     ext.w   drDATA
  1363.     adda.w  drDATA,arPC
  1364. nobcc:
  1365.     DISPATCH
  1366.  
  1367. ; STA (zp),Y
  1368. op91:
  1369.     EA_zpYind
  1370.     WriteAService
  1371.     move.b  drA,(arEA)
  1372.     DISPATCH
  1373.  
  1374. op92:
  1375.     UNUSED
  1376. op93:
  1377.     UNUSED
  1378.  
  1379. ; STY zp,X
  1380. op94:
  1381.     EA_zpX
  1382.     move.b  drY,(arEA)
  1383.     DISPATCH
  1384.  
  1385. ; STA zp,X
  1386. op95:
  1387.     EA_zpX
  1388.     move.b  drA,(arEA)
  1389.     DISPATCH
  1390.  
  1391. ; STX zp,Y
  1392. op96:
  1393.     EA_zpY
  1394.     move.b  drX,(arEA)
  1395.     DISPATCH
  1396.  
  1397. op97:
  1398.     UNUSED
  1399.  
  1400. ; TYA
  1401. op98:
  1402.     move.b  drY,drA
  1403.     move.b  drA,drST
  1404.     ext.w   drST
  1405.     DISPATCH
  1406.  
  1407. ; STA abs,Y
  1408. op99:
  1409.     EA_absY
  1410.     WriteAService
  1411.     move.b  drA,(arEA)
  1412.     DISPATCH
  1413.  
  1414. ; TXS
  1415. op9A:
  1416.     move.b  drX,drSP
  1417.     DISPATCH
  1418.  
  1419. op9B:
  1420.     UNUSED
  1421. op9C:
  1422.     UNUSED
  1423.  
  1424. ; STA abs,X
  1425. op9D:
  1426.     EA_absX
  1427.     WriteAService
  1428.     move.b  drA,(arEA)
  1429.     DISPATCH
  1430.  
  1431. op9E:
  1432.     UNUSED
  1433. op9F:
  1434.     UNUSED
  1435.  
  1436. ; LDY #
  1437. opA0:
  1438.     move.b  (arPC)+,drY
  1439.     move.b  drY,drST
  1440.     ext.w   drST
  1441.     DISPATCH
  1442.  
  1443. ; LDA (zp,X)
  1444. opA1:
  1445.     EA_zpXind
  1446.     ReadService
  1447.     move.b  (arEA),drA
  1448.     move.b  drA,drST
  1449.     ext.w   drST
  1450.     DISPATCH
  1451.  
  1452. ; LDX #
  1453. opA2:
  1454.     move.b  (arPC)+,drX
  1455.     move.b  drX,drST
  1456.     ext.w   drST
  1457.     DISPATCH
  1458.  
  1459. opA3:
  1460.     UNUSED
  1461.  
  1462. ; LDY zp
  1463. opA4:
  1464.     EA_zp
  1465.     move.b  (arEA),drY
  1466.     move.b  drY,drST
  1467.     ext.w   drST
  1468.     DISPATCH
  1469.  
  1470. ; LDA zp
  1471. opA5:
  1472.     EA_zp
  1473.     move.b  (arEA),drA
  1474.     move.b  drA,drST
  1475.     ext.w   drST
  1476.     DISPATCH
  1477.  
  1478. ; LDX zp
  1479. opA6:
  1480.     EA_zp
  1481.     move.b  (arEA),drX
  1482.     move.b  drX,drST
  1483.     ext.w   drST
  1484.     DISPATCH
  1485.  
  1486. opA7:
  1487.     UNUSED
  1488.  
  1489. ; TAY
  1490. opA8:
  1491.     move.b  drA,drY
  1492.     move.b  drY,drST
  1493.     ext.w   drST
  1494.     DISPATCH
  1495.  
  1496. ; LDA #
  1497. opA9:
  1498.     move.b  (arPC)+,drA
  1499.     move.b  drA,drST
  1500.     ext.w   drST
  1501.     DISPATCH
  1502.  
  1503. ; TAX
  1504. opAA:
  1505.     move.b  drA,drX
  1506.     move.b  drX,drST
  1507.     ext.w   drST
  1508.     DISPATCH
  1509.  
  1510. opAB:
  1511.     UNUSED
  1512.  
  1513. ; LDY abs
  1514. opAC:
  1515.     EA_abs
  1516.     ReadService
  1517.     move.b  (arEA),drY
  1518.     move.b  drY,drST
  1519.     ext.w   drST
  1520.     DISPATCH
  1521.  
  1522. ; LDA abs
  1523. opAD:
  1524.     EA_abs
  1525.     ReadService
  1526.     move.b  (arEA),drA
  1527.     move.b  drA,drST
  1528.     ext.w   drST
  1529.     DISPATCH
  1530.  
  1531. ; LDX abs
  1532. opAE:
  1533.     EA_abs
  1534.     ReadService
  1535.     move.b  (arEA),drX
  1536.     move.b  drX,drST
  1537.     ext.w   drST
  1538.     DISPATCH
  1539.  
  1540. opAF:
  1541.     UNUSED
  1542.  
  1543. ; BCS
  1544. opB0:
  1545.     move.b  (arPC)+,drDATA
  1546.     tst.b   drC
  1547.     beq.s   nobcs
  1548.     ext.w   drDATA
  1549.     adda.w  drDATA,arPC
  1550. nobcs:
  1551.     DISPATCH
  1552.  
  1553. ; LDA (zp),Y
  1554. opB1:
  1555.     EA_zpYind
  1556.     ReadService
  1557.     move.b  (arEA),drA
  1558.     move.b  drA,drST
  1559.     ext.w   drST
  1560.     DISPATCH
  1561.  
  1562. opB2:
  1563.     UNUSED
  1564. opB3:
  1565.     UNUSED
  1566.  
  1567. ; LDY zp,X
  1568. opB4:
  1569.     EA_zpX
  1570.     move.b  (arEA),drY
  1571.     move.b  drY,drST
  1572.     ext.w   drST
  1573.     DISPATCH
  1574.  
  1575. ; LDA zp,X
  1576. opB5:
  1577.     EA_zpX
  1578.     move.b  (arEA),drA
  1579.     move.b  drA,drST
  1580.     ext.w   drST
  1581.     DISPATCH
  1582.  
  1583. ; LDX zp,Y
  1584. opB6:
  1585.     EA_zpY
  1586.     move.b  (arEA),drX
  1587.     move.b  drX,drST
  1588.     ext.w   drST
  1589.     DISPATCH
  1590.  
  1591. opB7:
  1592.     UNUSED
  1593.  
  1594. ; CLV
  1595. opB8:
  1596.     clr.b   bV(arEMUL)
  1597.     DISPATCH
  1598.  
  1599. ; LDA abs,Y
  1600. opB9:
  1601.     EA_absY
  1602.     ReadService
  1603.     move.b  (arEA),drA
  1604.     move.b  drA,drST
  1605.     ext.w   drST
  1606.     DISPATCH
  1607.  
  1608. ; TAX
  1609. opBA:
  1610.     move.b  drSP,drX
  1611.     move.b  drX,drST
  1612.     ext.w   drST
  1613.     DISPATCH
  1614.  
  1615. opBB:
  1616.     UNUSED
  1617.  
  1618. ; LDY abs,X
  1619. opBC:
  1620.     EA_absX
  1621.     ReadService
  1622.     move.b  (arEA),drY
  1623.     move.b  drY,drST
  1624.     ext.w   drST
  1625.     DISPATCH
  1626.  
  1627. ; LDA abs,X
  1628. opBD:
  1629.     EA_absX
  1630.     ReadService
  1631.     move.b  (arEA),drA
  1632.     move.b  drA,drST
  1633.     ext.w   drST
  1634.     DISPATCH
  1635.  
  1636. ; LDX abs,Y
  1637. opBE:
  1638.     EA_absY
  1639.     ReadService
  1640.     move.b  (arEA),drX
  1641.     move.b  drX,drST
  1642.     ext.w   drST
  1643.     DISPATCH
  1644.  
  1645. opBF:
  1646.     UNUSED
  1647.  
  1648. ; CPY #
  1649. opC0:
  1650.     move.b  (arPC)+,drDATA
  1651.     move.w  drY,drEA
  1652.     sub.b   drDATA,drEA
  1653.     scc     drC
  1654.     move.b  drEA,drST
  1655.     ext.w   drST
  1656.     DISPATCH
  1657.  
  1658. ; CMP (zp,X)
  1659. opC1:
  1660.     EA_zpXind
  1661.     ReadService
  1662.     move.b  (arEA),drDATA
  1663.     move.w  drA,drST        ; must do a subtract without affecting arA
  1664.     sub.b   drDATA,drST
  1665.     scc     drC
  1666.     ext.w   drST
  1667.     DISPATCH
  1668.  
  1669. opC2:
  1670.     UNUSED
  1671. opC3:
  1672.     UNUSED
  1673.  
  1674. ; CPY zp
  1675. opC4:
  1676.     EA_zp
  1677.     move.b  (arEA),drDATA
  1678.     move.w  drY,drEA
  1679.     sub.b   drDATA,drEA
  1680.     scc     drC
  1681.     move.b  drEA,drST
  1682.     ext.w   drST
  1683.     DISPATCH
  1684.  
  1685. ; CMP zp
  1686. opC5:
  1687.     EA_zp
  1688.     move.b  (arEA),drDATA
  1689.     move.w  drA,drST        ; must do a subtract without affecting arA
  1690.     sub.b   drDATA,drST
  1691.     scc     drC
  1692.     ext.w   drST
  1693.     DISPATCH
  1694.  
  1695. ; DEC zp
  1696. opC6:
  1697.     EA_zp
  1698.     subq.b  #1,(arEA)
  1699.     move.b  (arEA),drST
  1700.     ext.w   drST
  1701.     DISPATCH
  1702.  
  1703. opC7:
  1704.     UNUSED
  1705.  
  1706. ; INY
  1707. opC8:
  1708.     addq.b  #1,drY
  1709.     move.b  drY,drST
  1710.     ext.w   drST
  1711.     DISPATCH
  1712.  
  1713. ; CMP #
  1714. opC9:
  1715.     move.b  (arPC)+,drDATA
  1716.     move.w  drA,drST        ; must do a subtract without affecting arA
  1717.     sub.b   drDATA,drST
  1718.     scc     drC
  1719.     ext.w   drST
  1720.     DISPATCH
  1721.  
  1722. ; DEX
  1723. opCA:
  1724.     subq.b  #1,drX
  1725.     move.b  drX,drST
  1726.     ext.w   drST
  1727.     DISPATCH
  1728.  
  1729. opCB:
  1730.     UNUSED
  1731.  
  1732. ; CPY abs
  1733. opCC:
  1734.     EA_abs
  1735.     ReadService
  1736.     move.b  (arEA),drDATA
  1737.     move.w  drY,drEA
  1738.     sub.b   drDATA,drEA
  1739.     scc     drC
  1740.     move.b  drEA,drST
  1741.     ext.w   drST
  1742.     DISPATCH
  1743.  
  1744. ; CMP abs
  1745. opCD:
  1746.     EA_abs
  1747.     ReadService
  1748.     move.b  (arEA),drDATA
  1749.     move.w  drA,drST        ; must do a subtract without affecting arA
  1750.     sub.b   drDATA,drST
  1751.     scc     drC
  1752.     ext.w   drST
  1753.     DISPATCH
  1754.  
  1755. ; DEC abs
  1756. opCE:
  1757.     EA_abs
  1758.     ReadService
  1759.     move.b  (arEA),drST
  1760.     subq.b  #1,drST
  1761.     ext.w   drST
  1762.     WriteService
  1763.     move.b  drST,(arEA)
  1764.     DISPATCH
  1765.  
  1766. opCF:
  1767.     UNUSED
  1768.  
  1769. ; BNE
  1770. opD0:
  1771.     move.b  (arPC)+,drDATA
  1772.     tst.b   drST
  1773.     beq.s   nobne
  1774.     ext.w   drDATA
  1775.     adda.w  drDATA,arPC
  1776. nobne:
  1777.     DISPATCH
  1778.  
  1779. ; CMP (zp),Y
  1780. opD1:
  1781.     EA_zpYind
  1782.     ReadService
  1783.     move.b  (arEA),drDATA
  1784.     move.w  drA,drST        ; must do a subtract without affecting arA
  1785.     sub.b   drDATA,drST
  1786.     scc     drC
  1787.     ext.w   drST
  1788.     DISPATCH
  1789.  
  1790. opD2:
  1791.     UNUSED
  1792. opD3:
  1793.     UNUSED
  1794. opD4:
  1795.     UNUSED
  1796.  
  1797. ; CMP zp,X
  1798. opD5:
  1799.     EA_zpX
  1800.     move.b  (arEA),drDATA
  1801.     move.w  drA,drST        ; must do a subtract without affecting arA
  1802.     sub.b   drDATA,drST
  1803.     scc     drC
  1804.     ext.w   drST
  1805.     DISPATCH
  1806.  
  1807. ; DEC zp,X
  1808. opD6:
  1809.     EA_zpX
  1810.     subq.b  #1,(arEA)
  1811.     move.b  (arEA),drST
  1812.     ext.w   drST
  1813.     DISPATCH
  1814.  
  1815. opD7:
  1816.     UNUSED
  1817.  
  1818. ; CLD
  1819. opD8:
  1820.     bclr    #31,drST
  1821. ;    sf      bD(arEMUL)
  1822.     DISPATCH
  1823.  
  1824. ; CMP abs,Y
  1825. opD9:
  1826.     EA_absY
  1827.     ReadService
  1828.     move.b  (arEA),drDATA
  1829.     move.w  drA,drST        ; must do a subtract without affecting arA
  1830.     sub.b   drDATA,drST
  1831.     scc     drC
  1832.     ext.w   drST
  1833.     DISPATCH
  1834.  
  1835. opDA:
  1836.     UNUSED
  1837. opDB:
  1838.     UNUSED
  1839. opDC:
  1840.     UNUSED
  1841.  
  1842. ; CMP abs,X
  1843. opDD:
  1844.     EA_absX
  1845.     ReadService
  1846.     move.b  (arEA),drDATA
  1847.     move.w  drA,drST        ; must do a subtract without affecting arA
  1848.     sub.b   drDATA,drST
  1849.     scc     drC
  1850.     ext.w   drST
  1851.     DISPATCH
  1852.  
  1853. ; DEC abs,X
  1854. opDE:
  1855.     EA_absX
  1856.     ReadService
  1857.     move.b  (arEA),drST
  1858.     subq.b  #1,drST
  1859.     ext.w   drST
  1860.     WriteService
  1861.     move.b  drST,(arEA)
  1862.     DISPATCH
  1863.  
  1864. opDF:
  1865.     UNUSED
  1866.  
  1867. ; CPX #
  1868. opE0:
  1869.     move.b  (arPC)+,drDATA
  1870.     move.w  drX,drEA
  1871.     sub.b   drDATA,drEA
  1872.     scc     drC
  1873.     move.b  drEA,drST
  1874.     ext.w   drST
  1875.     DISPATCH
  1876.  
  1877. ; SBC (zp,X)
  1878. opE1:
  1879.     EA_zpXind
  1880.     ReadService
  1881.     tst.l   drST        ; test D flag
  1882. ;    tst.b   bD(arEMUL)
  1883.     bmi.s   opE1dec
  1884.     move.b  (arEA),drDATA
  1885.     not.b   drC
  1886.     add.b   drC,drC
  1887.     subx.b  drDATA,drA
  1888.     scc     drC
  1889.     svs     bV(arEMUL)
  1890.     move.b  drA,drST
  1891.     ext.w   drST
  1892.     DISPATCH
  1893. opE1dec:
  1894.     move.b  (arEA),drDATA
  1895.     not.b   drC
  1896.     add.b   drC,drC     ; set X flag
  1897.     clr.b   drC         ; sets Z flag for the SBCD without clearing X
  1898.     sbcd    drDATA,drA
  1899.     scc     drC
  1900.     svs     bV(arEMUL)
  1901.     move.b  drA,drST
  1902.     ext.w   drST
  1903.     DISPATCH
  1904.  
  1905. opE2:
  1906.     UNUSED
  1907. opE3:
  1908.     UNUSED
  1909.  
  1910. ; CPX zp
  1911. opE4:
  1912.     EA_zp
  1913.     move.b  (arEA),drDATA
  1914.     move.w  drX,drEA
  1915.     sub.b   drDATA,drEA
  1916.     scc     drC
  1917.     move.b  drEA,drST
  1918.     ext.w   drST
  1919.     DISPATCH
  1920.  
  1921. ; SBC zp
  1922. opE5:
  1923.     EA_zp
  1924.     tst.l   drST        ; test D flag
  1925. ;    tst.b   bD(arEMUL)
  1926.     bmi.s   opE5dec
  1927.     move.b  (arEA),drDATA
  1928.     not.b   drC
  1929.     add.b   drC,drC
  1930.     subx.b  drDATA,drA
  1931.     scc     drC
  1932.     svs     bV(arEMUL)
  1933.     move.b  drA,drST
  1934.     ext.w   drST
  1935.     DISPATCH
  1936. opE5dec:
  1937.     move.b  (arEA),drDATA
  1938.     not.b   drC
  1939.     add.b   drC,drC     ; set X flag
  1940.     clr.b   drC         ; sets Z flag for the SBCD without clearing X
  1941.     sbcd    drDATA,drA
  1942.     scc     drC
  1943.     svs     bV(arEMUL)
  1944.     move.b  drA,drST
  1945.     ext.w   drST
  1946.     DISPATCH
  1947.  
  1948. ; INC zp
  1949. opE6:
  1950.     EA_zp
  1951.     addq.b  #1,(arEA)
  1952.     move.b  (arEA),drST
  1953.     ext.w   drST
  1954.     DISPATCH
  1955.  
  1956. opE7:
  1957.     UNUSED
  1958.  
  1959. ; INX
  1960. opE8:
  1961.     addq.b  #1,drX
  1962.     move.b  drX,drST
  1963.     ext.w   drST
  1964.     DISPATCH
  1965.  
  1966. ; SBC #
  1967. opE9:
  1968.     tst.l   drST        ; test D flag
  1969. ;    tst.b   bD(arEMUL)
  1970.     bmi.s   opE9dec
  1971.     move.b  (arPC)+,drDATA
  1972.     not     drC
  1973.     add.b   drC,drC
  1974.     subx.b  drDATA,drA
  1975.     scc     drC
  1976.     svs     bV(arEMUL)
  1977.     move.b  drA,drST
  1978.     ext.w   drST
  1979.     DISPATCH
  1980. opE9dec:
  1981.     move.b  (arPC)+,drDATA
  1982.     not.b   drC
  1983.     add.b   drC,drC     ; set X flag
  1984.     clr.b   drC         ; sets Z flag for the SBCD without clearing X
  1985.     sbcd    drDATA,drA
  1986.     scc     drC
  1987.     svs     bV(arEMUL)
  1988.     move.b  drA,drST
  1989.     ext.w   drST
  1990.     DISPATCH
  1991.  
  1992. ; NOP
  1993. opEA:
  1994.     DISPATCH
  1995. opEB:
  1996.     UNUSED
  1997.  
  1998. ; CPX abs
  1999. opEC:
  2000.     EA_abs
  2001.     ReadService
  2002.     move.b  (arEA),drDATA
  2003.     move.w  drX,drEA
  2004.     sub.b   drDATA,drEA
  2005.     scc     drC
  2006.     move.b  drEA,drST
  2007.     ext.w   drST
  2008.     DISPATCH
  2009.  
  2010. ; SBC abs
  2011. opED:
  2012.     EA_abs
  2013.     ReadService
  2014.     tst.l   drST        ; test D flag
  2015. ;    tst.b   bD(arEMUL)
  2016.     bmi.s   opEDdec
  2017.     move.b  (arEA),drDATA
  2018.     not.b   drC
  2019.     add.b   drC,drC
  2020.     subx.b  drDATA,drA
  2021.     scc     drC
  2022.     svs     bV(arEMUL)
  2023.     move.b  drA,drST
  2024.     ext.w   drST
  2025.     DISPATCH
  2026. opEDdec:
  2027.     move.b  (arEA),drDATA
  2028.     not.b   drC
  2029.     add.b   drC,drC     ; set X flag
  2030.     clr.b   drC         ; sets Z flag for the SBCD without clearing X
  2031.     sbcd    drDATA,drA
  2032.     scc     drC
  2033.     svs     bV(arEMUL)
  2034.     move.b  drA,drST
  2035.     ext.w   drST
  2036.     DISPATCH
  2037.  
  2038. ; INC abs
  2039. opEE:
  2040.     EA_abs
  2041.     ReadService
  2042.     move.b  (arEA),drST
  2043.     addq.b  #1,drST
  2044.     ext.w   drST
  2045.     WriteService
  2046.     move.b  drST,(arEA)
  2047.     DISPATCH
  2048.  
  2049. opEF:
  2050.     UNUSED
  2051.  
  2052. ; BEQ
  2053. opF0:
  2054.     move.b  (arPC)+,drDATA   ; get relative offset
  2055.     tst.b   drST
  2056.     bne.s   nobeq
  2057.     ext.w   drDATA
  2058.     adda.w  drDATA,arPC
  2059.   nobeq:
  2060.     DISPATCH
  2061.  
  2062. ; SBC (zp),Y
  2063. opF1:
  2064.     EA_zpYind
  2065.     ReadService
  2066.     tst.l   drST        ; test D flag
  2067. ;    tst.b   bD(arEMUL)
  2068.     bmi.s   opF1dec
  2069.     move.b  (arEA),drDATA
  2070.     not.b   drC
  2071.     add.b   drC,drC
  2072.     subx.b  drDATA,drA
  2073.     scc     drC
  2074.     svs     bV(arEMUL)
  2075.     move.b  drA,drST
  2076.     ext.w   drST
  2077.     DISPATCH
  2078. opF1dec:
  2079.     move.b  (arEA),drDATA
  2080.     not.b   drC
  2081.     add.b   drC,drC     ; set X flag
  2082.     clr.b   drC         ; sets Z flag for the SBCD without clearing X
  2083.     sbcd    drDATA,drA
  2084.     scc     drC
  2085.     svs     bV(arEMUL)
  2086.     move.b  drA,drST
  2087.     ext.w   drST
  2088.     DISPATCH
  2089.  
  2090. opF2:
  2091.     UNUSED
  2092. opF3:
  2093.     UNUSED
  2094. opF4:
  2095.     UNUSED
  2096.  
  2097. ; SBC zp,X
  2098. opF5:
  2099.     EA_zpX
  2100.     tst.l   drST        ; test D flag
  2101. ;    tst.b   bD(arEMUL)
  2102.     bmi.s   opF5dec
  2103.     move.b  (arEA),drDATA
  2104.     not.b   drC
  2105.     add.b   drC,drC
  2106.     subx.b  drDATA,drA
  2107.     scc     drC
  2108.     svs     bV(arEMUL)
  2109.     move.b  drA,drST
  2110.     ext.w   drST
  2111.     DISPATCH
  2112. opF5dec:
  2113.     move.b  (arEA),drDATA
  2114.     not.b   drC
  2115.     add.b   drC,drC     ; set X flag
  2116.     clr.b   drC         ; sets Z flag for the SBCD without clearing X
  2117.     sbcd    drDATA,drA
  2118.     scc     drC
  2119.     svs     bV(arEMUL)
  2120.     move.b  drA,drST
  2121.     ext.w   drST
  2122.     DISPATCH
  2123.  
  2124. ; INC zp,X
  2125. opF6:
  2126.     EA_zpX
  2127.     addq.b  #1,(arEA)
  2128.     move.b  (arEA),drST
  2129.     ext.w   drST
  2130.     DISPATCH
  2131.  
  2132. opF7:
  2133.     UNUSED
  2134.  
  2135. ; SED
  2136. opF8:
  2137.     bset    #31,drST
  2138. ;    st      bD(arEMUL)
  2139.     DISPATCH
  2140.  
  2141. ; SBC abs,Y
  2142. opF9:
  2143.     EA_absY
  2144.     ReadService
  2145.     tst.l   drST        ; test D flag
  2146. ;    tst.b   bD(arEMUL)
  2147.     bmi.s   opF9dec
  2148.     move.b  (arEA),drDATA
  2149.     not.b   drC
  2150.     add.b   drC,drC
  2151.     subx.b  drDATA,drA
  2152.     scc     drC
  2153.     svs     bV(arEMUL)
  2154.     move.b  drA,drST
  2155.     ext.w   drST
  2156.     DISPATCH
  2157. opF9dec:
  2158.     move.b  (arEA),drDATA
  2159.     not.b   drC
  2160.     add.b   drC,drC     ; set X flag
  2161.     clr.b   drC         ; sets Z flag for the SBCD without clearing X
  2162.     sbcd    drDATA,drA
  2163.     scc     drC
  2164.     svs     bV(arEMUL)
  2165.     move.b  drA,drST
  2166.     ext.w   drST
  2167.     DISPATCH
  2168.  
  2169. opFA:
  2170.     UNUSED
  2171. opFB:
  2172.     UNUSED
  2173. opFC:
  2174.     UNUSED
  2175.  
  2176. ; SBC abs,X
  2177. opFD:
  2178.     EA_absX
  2179.     ReadService
  2180.     tst.l   drST        ; test D flag
  2181. ;    tst.b   bD(arEMUL)
  2182.     bmi.s   opFDdec
  2183.     move.b  (arEA),drDATA
  2184.     not.b   drC
  2185.     add.b   drC,drC
  2186.     subx.b  drDATA,drA
  2187.     scc     drC
  2188.     svs     bV(arEMUL)
  2189.     move.b  drA,drST
  2190.     ext.w   drST
  2191.     DISPATCH
  2192. opFDdec:
  2193.     move.b  (arEA),drDATA
  2194.     not.b   drC
  2195.     add.b   drC,drC     ; set X flag
  2196.     clr.b   drC         ; sets Z flag for the SBCD without clearing X
  2197.     sbcd    drDATA,drA
  2198.     scc     drC
  2199.     svs     bV(arEMUL)
  2200.     move.b  drA,drST
  2201.     ext.w   drST
  2202.     DISPATCH
  2203.  
  2204. ; INC abs,X
  2205. opFE:
  2206.     EA_absX
  2207.     ReadService
  2208.     move.b  (arEA),drST
  2209.     addq.b  #1,drST
  2210.     ext.w   drST
  2211.     WriteService
  2212.     move.b  drST,(arEA)
  2213.     DISPATCH
  2214.   
  2215. opFF:
  2216.     UNUSED
  2217.  
  2218. opXX:
  2219.     UNUSED
  2220.     }
  2221.     }
  2222.  
  2223. /************************************************************************
  2224.  
  2225.     6502 Monitor subroutines, kept here for uP independence
  2226.  
  2227. ************************************************************************/
  2228.  
  2229. int Peek(uAddr)
  2230. unsigned uAddr;
  2231.     {
  2232.     return ((int) *(char *)(lMemory + (long)uAddr)) & 0xFF;
  2233.     }
  2234.  
  2235. int Dpeek(uAddr)
  2236. unsigned uAddr;
  2237.     {
  2238.     return (unsigned)(Peek(uAddr)) + (unsigned)(Peek(uAddr+1)<<8);
  2239.     }
  2240.  
  2241. void Poke(uAddr, b)
  2242. unsigned uAddr;
  2243. int b;
  2244.     {
  2245.     *(char *)(lMemory + (long)uAddr) = (char)b;
  2246.     }
  2247.  
  2248. int GetReg(chReg)
  2249. int chReg;
  2250.     {
  2251.     switch (chReg)
  2252.         {
  2253.     default:
  2254.         Assert(FALSE, "GetReg(): invalid reg");
  2255.         return;
  2256.     case 'A':
  2257.         return *(char *)(lEmul + (bRegA));
  2258.     case 'X':
  2259.         return *(char *)(lEmul + (bRegX));
  2260.     case 'Y':
  2261.         return *(char *)(lEmul + (bRegY));
  2262.     case 'P':
  2263.         return *(char *)(lEmul + (bRegP));
  2264.     case 'SP':
  2265.         return *(int *)(lEmul + (wRegSP));
  2266.     case 'PC':
  2267.         return *(int *)(lEmul + (wRegPC));
  2268.         }
  2269.     }
  2270.  
  2271. void PutReg(chReg, w)
  2272. int chReg;
  2273. int w;
  2274.     {
  2275.     switch (chReg)
  2276.         {
  2277.     default:
  2278.         Assert(FALSE, "PutReg(): invalid reg");
  2279.         return;
  2280.     case 'A':
  2281.         *(char *)(lEmul + (bRegA)) = (char)w;
  2282.     case 'X':
  2283.         *(char *)(lEmul + (bRegX)) = (char)w;
  2284.     case 'Y':
  2285.         *(char *)(lEmul + (bRegY)) = (char)w;
  2286.     case 'P':
  2287.         *(char *)(lEmul + (bRegP)) = (char)w;
  2288.     case 'SP':
  2289.         *(int *)(lEmul + (wRegSP)) = (char)w;
  2290.     case 'PC':
  2291.         *(int *)(lEmul + (wRegPC)) = w;
  2292.         }
  2293.     }
  2294.  
  2295. int CchShowRegs(pch)
  2296. char *pch;
  2297.     {
  2298.     int regP;
  2299.     char chNil = '.';
  2300.  
  2301.     Blit("PC:     A:   X:   Y:   SP:   P:   ", pch);
  2302.  
  2303.     XtoPch(pch+3, GetReg('PC'));
  2304.     BtoPch(pch+10, GetReg('A'));
  2305.     BtoPch(pch+15, GetReg('X'));
  2306.     BtoPch(pch+20, GetReg('Y'));
  2307.     BtoPch(pch+26, GetReg('SP'));
  2308.     BtoPch(pch+31, regP = GetReg('P'));
  2309.     pch[34] = (regP & NBIT) ? 'N' : chNil;
  2310.     pch[35] = (regP & VBIT) ? 'V' : chNil;
  2311.     pch[36] = '_';
  2312.     pch[37] = (regP & BBIT) ? 'B' : chNil;
  2313.     pch[38] = (regP & DBIT) ? 'D' : chNil;
  2314.     pch[39] = (regP & IBIT) ? 'I' : chNil;
  2315.     pch[40] = (regP & ZBIT) ? 'Z' : chNil;
  2316.     pch[41] = (regP & CBIT) ? 'C' : chNil;
  2317.  
  2318.     return 42;
  2319.     }
  2320.  
  2321. /* start execution at address uAddr */
  2322. int RunAt(puAddr)
  2323. unsigned int *puAddr;
  2324.     {
  2325.     unsigned int uAddr = *puAddr;
  2326.  
  2327. #ifdef NDEBUG
  2328.     printf("executing at: %4x\n", uAddr);
  2329.     printf("fTrace = %d\n", fTrace);
  2330. #endif
  2331.  
  2332.     PutReg('PC',uAddr);
  2333.     Supexec(execute);
  2334.     *puAddr = GetReg('PC');
  2335.  
  2336. #ifdef NDEBUG
  2337.     printf("exit code: %d\n", *(int *)(lEmul + (wExitCode)));
  2338. #endif
  2339.     return *(int *)(lEmul + (wExitCode));
  2340.     }
  2341.  
  2342. /* start execution at the address stored in the vector at uAddr */
  2343. int RunThru(puAddr)
  2344. unsigned int *puAddr;
  2345.     {
  2346.     unsigned int uAddr = *puAddr;
  2347.  
  2348.     *puAddr = (unsigned)(Peek(uAddr)) + (unsigned)(Peek(uAddr+1)<<8);
  2349.     return (RunAt(puAddr));
  2350.     }
  2351.  
  2352. /* Disassemble instruction at location uMem to space filled buffer pch. */
  2353. /* Returns with puMem incremented appropriate number of bytes. */
  2354.  
  2355. int CchDisAsm(pch, puMem)
  2356. register char *pch;
  2357. register unsigned int *puMem;
  2358.     {
  2359.     register unsigned char bOpcode;
  2360.     register long lPackedOp;
  2361.     char *pch0 = pch;
  2362.     register int md;
  2363.  
  2364.     *pch++ = ',';
  2365.     XtoPch(pch, *puMem) + 1;
  2366.     pch += 5;
  2367.  
  2368.     /* get opcode */
  2369.     bOpcode = Peek(*puMem);
  2370.     BtoPch(pch, bOpcode);
  2371.  
  2372.     /* get packed opcode mnemonic and addressing mode */
  2373.     lPackedOp = rglMnemonics[bOpcode] ;
  2374.  
  2375.     /* addressing mode is LSB of long */
  2376.     md = (int)(lPackedOp & 0x0FL);
  2377.  
  2378.     /* first hex dump the bytes of the instruction */
  2379.     switch (md)
  2380.         {
  2381.     /* 2 operands */
  2382.     case 0x07:
  2383.     case 0x08:
  2384.     case 0x09:
  2385.     case 0x0C:
  2386.         BtoPch(pch + 6, Peek(*puMem + 2));
  2387.  
  2388.     /* one operand */
  2389.     case 0x01:
  2390.     case 0x02:
  2391.     case 0x03:
  2392.     case 0x04:
  2393.     case 0x05:
  2394.     case 0x06:
  2395.     case 0x0B:
  2396.         BtoPch(pch + 3, Peek(*puMem + 1));
  2397.  
  2398.     /* no operands */
  2399.     case 0x00:
  2400.     case 0x0A:
  2401.         pch += 10;
  2402.         break;
  2403.         }
  2404.  
  2405.     /* now dump the mnemonic */
  2406. asm
  2407.     {
  2408.     move.b  #' ',lPackedOp      ; clear the addressing mode byte
  2409.     }
  2410.     Assert(((long)pch & 1L) == 0L, "dump mnemonic at odd address!!");
  2411.     *(long *)pch = lPackedOp;
  2412.     pch += 4;
  2413.  
  2414.     *puMem += 1;
  2415.  
  2416.     switch (md)
  2417.         {
  2418.     case 0x00:
  2419.         break;
  2420.  
  2421.     case 0x01:
  2422.         pch = Blit("#$", pch);
  2423.         BtoPch(pch, Peek(*puMem));
  2424.         pch += 2;
  2425.         *puMem += 1;
  2426.         break;
  2427.  
  2428.     case 0x02:
  2429.         *pch++ = '$';
  2430.         BtoPch(pch, Peek(*puMem));
  2431.         pch += 2;
  2432.         *puMem += 1;
  2433.         break;
  2434.  
  2435.     case 0x03:
  2436.         *pch++ = '$';
  2437.         BtoPch(pch, Peek(*puMem));
  2438.         pch += 2;
  2439.         pch = Blit(",X",pch);
  2440.         *puMem += 1;
  2441.         break;
  2442.  
  2443.     case 0x04:
  2444.         *pch++ = '$';
  2445.         BtoPch(pch, Peek(*puMem));
  2446.         pch += 2;
  2447.         pch = Blit(",Y",pch);
  2448.         *puMem += 1;
  2449.         break;
  2450.  
  2451.     case 0x05:
  2452.         pch = Blit("($", pch);
  2453.         BtoPch(pch, Peek(*puMem));
  2454.         pch += 2;
  2455.         pch = Blit(",X)", pch);
  2456.         *puMem += 1;
  2457.         break;
  2458.  
  2459.     case 0x06:
  2460.         pch = Blit("($", pch);
  2461.         BtoPch(pch, Peek(*puMem));
  2462.         pch += 2;
  2463.         pch = Blit("),Y", pch);
  2464.         *puMem += 1;
  2465.         break;
  2466.  
  2467.     case 0x07:
  2468.         *pch++ = '$';
  2469.         BtoPch(pch, Peek(*puMem + 1));
  2470.         pch += 2;
  2471.         BtoPch(pch, Peek(*puMem));
  2472.         pch += 2;
  2473.         *puMem += 2;
  2474.         break;
  2475.  
  2476.     case 0x08:
  2477.         *pch++ = '$';
  2478.         BtoPch(pch, Peek(*puMem + 1));
  2479.         pch += 2;
  2480.         BtoPch(pch, Peek(*puMem));
  2481.         pch += 2;
  2482.         *puMem += 2;
  2483.         pch = Blit(",X", pch);
  2484.         break;
  2485.  
  2486.     case 0x09:
  2487.         *pch++ = '$';
  2488.         BtoPch(pch, Peek(*puMem + 1));
  2489.         pch += 2;
  2490.         BtoPch(pch, Peek(*puMem));
  2491.         pch += 2;
  2492.         *puMem += 2;
  2493.         pch = Blit(",Y", pch);
  2494.         break;
  2495.  
  2496.     case 0x0A:
  2497.         *pch++ = 'A';
  2498.         break;
  2499.  
  2500.     case 0x0B:
  2501.         {
  2502.         unsigned uMem;
  2503.  
  2504.         *pch++ = '$';
  2505.         uMem = (*puMem + 1 + (int)((char)Peek(*puMem)));
  2506.         BtoPch(pch, uMem>>8);
  2507.         pch += 2;
  2508.         BtoPch(pch, (char)uMem);
  2509.         pch += 2;
  2510.         *puMem += 1;
  2511.         }
  2512.         break;
  2513.  
  2514.     case 0x0C:
  2515.         pch = Blit("($", pch);
  2516.         BtoPch(pch, Peek(*puMem + 1));
  2517.         pch += 2;
  2518.         BtoPch(pch, Peek(*puMem));
  2519.         pch += 2;
  2520.         *pch++ = ')';
  2521.         *puMem += 2;
  2522.         break;
  2523.         }
  2524.  
  2525.     return (int)(pch - pch0);
  2526.     }
  2527.  
  2528.  
  2529. /***********************************************************************/
  2530.  
  2531. fn_nul()
  2532.     {
  2533.     }
  2534.  
  2535. int (*pHookIn)()=fn_nul, (*pUnHook)()=fn_nul;
  2536. long *qlVBIslot;
  2537.  
  2538. VBI_on(qbVBI)
  2539. long qbVBI;
  2540.     {
  2541. #ifdef NDEBUG
  2542.     printf("VBI_on(): qbVBI = $%5lx\n", qbVBI);
  2543. #endif
  2544.  
  2545.     qlVBIslot = *(long **)0x456L;
  2546.  
  2547. #ifdef NDEBUG
  2548.     printf("VBI_on(): #1 qlVBIslot = $%5lx\n", qlVBIslot);
  2549. #endif
  2550.  
  2551.     while (*qlVBIslot != 0L)
  2552.             {
  2553.             qlVBIslot++;
  2554. #ifdef NDEBUG
  2555.     printf("VBI_on(): #2 qlVBIslot = $%5lx\n", qlVBIslot);
  2556. #endif
  2557.             }
  2558.  
  2559.     *qlVBIslot = qbVBI;
  2560.  
  2561.     Vsync();
  2562.  
  2563. #ifdef NDEBUG
  2564.     printf("VBI_on():  qlVBIslot = $%5lx\n", qlVBIslot);
  2565. #endif
  2566.     }
  2567.  
  2568. VBI_off()
  2569.     {
  2570.     *qlVBIslot = 0L;
  2571.     Vsync();
  2572.     
  2573. #ifdef NDEBUG
  2574.     printf("VBI_off(): qlVBIslot = $%5lx\n", qlVBIslot);
  2575. #endif
  2576.     }
  2577.  
  2578. /***********************************************************************/
  2579.  
  2580.  
  2581.